
#ifdef a
//#ifdef a
//写一个完整的日期类
#include<iostream>
using namespace std;
class Date {
public:
	//构造函数
	Date(int month = 6, int day = 1, int year = 2022)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		//如果所给日期非法，则设为默认日期 2020.6.1
		if (!(_year > 0 && _month >= 1 && _month <= 12 && _day >= 1 && _day <= GetDayOfMonth(_year, _month))) {
			_year = 2022;
			_month = 6;
			_day = 1;
		}
	}
	//析构函数
	~Date() {
		//		_year = _day = _month = -1;
	}
	//拷贝构造函数
	Date(const Date& d)
		:_day(d._day)
		, _month(d._month)
		, _year(d._year)
	{}

	void Print() const {
		cout << _year << '.' << _month << '.' << _day << endl;
	}
	void Print(const Date& d) {
		cout << _year << '.' << _month << '.' << _day << endl;
	}

	//赋值运算符重载函数
	Date& operator=(const Date& d) {
		if (this != &d) {
			_month = d._month;
			_year = d._year;
			_day = d._day;
		}
		return *this;
	}

	//== 操作符重载
	bool operator==(const Date& d) const {
		return
			_year == d._year &&
			_month == d._month &&
			_day == d._day;
	}

	//!= 操作符重载
	bool operator!=(const Date& d)const {
		return !(*this == d);
	}

	//取地址重载
	Date* operator&() {
		return this;
	}

	//const取地址重载
	const Date* operator&()const {
		return this;
	}

	//+ 重载(n天后是什么日期)
	Date& operator+(const int days) {
		if (days < 0)
			return *this - (0 - days);//加负数转换为减正数
		Date temp(*this);
		temp._day += days;
		int days_of_month = 0;
		while (temp._day > GetDayOfMonth(temp._year, temp._month)) {
			temp._day -= GetDayOfMonth(temp._year, temp._month);
			temp._month += 1;
			if (temp._month > 12) {
				temp._year += 1;
				temp._month = 1;
			}
		}
		return temp;
	}

	//- 重载(日期之间的间隔)
	int operator-(const Date& d)const {
		Date min_date(d);
		Date max_date(*this);
		if (min_date > max_date) {
			min_date = *this;
			max_date = d;
		}
		int count = 0;
		while (min_date != max_date) {
			++min_date;
			count++;
		}
		return count;
	}

	//重载 - （days 天前）
	Date& operator-(const int days) {
		if (days < 0)
			return *this + (0 - days);//减负转化为加正
		Date temp(*this);
		temp._day -= days;
		while (temp._day <= 0) {
			temp._month -= 1;
			if (temp._month <= 0) {
				temp._year -= 1;
				temp._month = 12;
			}
			temp._day += GetDayOfMonth(temp._year, temp._month);

		}
		return temp;
	}
	//重载前置++
	Date& operator++() {
		*this = *this + 1;
		return *this;
	}
	//重载前置--
	Date& operator--() {
		*this = *this - 1;
		return *this;
	}
	//重弄后置++
	Date& operator++(int) {
		Date temp(*this);
		*this = *this + 1;
		return temp;
	}

	//重载后置--
	Date& operator--(int) {
		Date temp(*this);
		--(*this);
		return temp;
	}


	//> 运算符重载
	bool operator>(const Date& d)const {
		return  (_year > d._year) ||
			(_year == d._year && _month > d._month) ||
			(_year == d._year && _month == d._month && _day > d._day);
	}

	//<运算符重载
	bool operator<(const Date& d)const {
		return !(*this > d || *this == d);
	}
	bool LeadYear(const int year) {
		return (!(year % 4) && year % 100 || !(year % 400));
	}
private:
	int _year;
	int _month;
	int _day;
	int GetDayOfMonth(const int year, const int month) {
		int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (LeadYear(year))
			days[2] += 1;
		return days[month];
	}

};

void TestDate() {
	//前后--测试
	/*
	Date d1(6, 3);
	d1.Print();
	Date d2 = d1--;
	d2.Print();
	d1.Print();
	*/

	//前后++测试
	/*
	Date d1(6, 3);
	d1.Print();
	Date d2 = d1++;
	d2.Print();
	d1.Print();
	*/

	//重载 - -》》日期间隔测试
	/*
	Date d1(6, 3);
	Date d2(1,1);
	int ret = d1 - d2;
	cout << ret << endl;
	*/

	//重载 - 测试》》日期前days天
	/*
	Date d1;
	Date d2(1, 11, 2021);
	Date d3 = d1 - 500;
	int ret = d1 - d2;
	cout << ret << endl;
	d3.Print();
	*/

	//重载 + 测试》》日期后days天
	/*
	Date d1;//2022.6.1
	Date d2 = d1 + 560;
	d2.Print();
	*/
}
int main() {
	TestDate();
	return 0;
}

#endif
